home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / docs / corsoguide / rinfresco-17.txt < prev    next >
Text File  |  1992-09-03  |  5KB  |  94 lines

  1. Il Rinfresco delle finestre
  2.  
  3. Come voi tutti sapete le finestre possono essere spostate, ingrandite,
  4. rimpicciolite, fatte scivolare una davanti all'altra ecc.; il sistema di
  5. Amiga è progettato in maniera così flessibile che tutto ciò è gestito in
  6. maniera trasparente all'applicazione; vale a dire che l'applicazione disegna
  7. all'interno della finestra sempre nella stessa maniera e con le stesse
  8. cordinate, indipendentemente dalla posizione o grandezza di quest'ultima; un
  9. problemma tuttavia permane: cosa succede quando una zona oscurata da
  10. un'altra finestra viene riportata alla luce? In tal caso il sistema informa
  11. l'applicazione, mediante un messaggio IDCMP_REFRESHWINDOW alla porta IDCMP
  12. della finestra; l'applicazione una volta ricevuto questo messaggio, deve
  13. effettuare una chiamate BeginRefresh(), procedere con i dovuti rinfreschi al
  14. contenuto della finestra e chiamare EndRefresh(); nel caso non si debba
  15. effettuare alcun rinfresco, bisogna comunque chiamare la coppia delle
  16. funzioni appena viste senza alcuna istruzione al loro interno; sintassi di
  17. queste due funzioni è:
  18.  
  19. BeginRefresh(finestra);
  20.  
  21. dove "finestra" è il puntatore alla finestra di cui effettuare il rinfresco;
  22.  
  23. EndRefresh(finestra,finito);
  24.  
  25. "finestra" è la stessa della BeginRefresh corrispondente, "finito" è una
  26. variabile booleana e vale TRUE se il rinfresco è stato ultimato; FALSE se il
  27. rinfresco non è finito, allora il sistema mantiene bloccato il layer della
  28. finestra fino a quando non si esegue una coppia BeginRefresh/EndRefresh con
  29. "finito" impostato a TRUE; vi chiederete perchè spezzettare l'operazione di
  30. rinfresco in diversi blocchi: durante il rinfresco il sistema attende, per
  31. cui è IMPORTANTE che il codice del blocco di rinfresco sai molto veloce;
  32. spezzettando l'operazione di rinfresco in più sezioni, è agevole ripassare
  33. il controllo al sistema senza bloccarlo per un tempo esagerato.
  34. Se non desiderate effettuare alcun rinfresco e quindi chiamare le due
  35. istruzioni appena indicate, oppure volete far realizzare il rinfresco
  36. totalmente al sistema, potete impostare il flag WA_NoCareRefresh.
  37. Esistono tre tipi differenti di rinfresco organizzati dal sistema, ognuno
  38. con livello di efficienza e anche di consumo crescente:
  39.  
  40. Simple refresh
  41. Simple refresh è il rinfresco più semplice: vengono mantenuti e rinfrescati
  42. tutti quei pixels che sono visualizzati sullo schermo; ad esempio, se una
  43. finestra viene spostata, il suo contenuto viene ricopiato; i problemi si
  44. verificano quando un'altra finestra passa davanti a quella "rinfrescata" in
  45. quanto il suo contenuto viene oscurato, per cui se la finestra viene
  46. spostata o riportata in avanti, la zona oscurata non viene rinfrescata.
  47. Questo tipo di rinfresco si attiva impostando WFLG_SIMPLE_REFRESH nel tag
  48. WA_Flags.
  49.  
  50. Smart refresh
  51. Nella finestra Smart refresh il sistema mantiene e rinfresca tutto il
  52. contenuto della finestra; nel caso visto prima, anche se la finestra con
  53. questo tipo di rinfresco viene oscurata, quando viene riportata alla luce
  54. la zona prima non visibile, viene correttamente ridisegnata; questo
  55. rinfresco si attiva impostando WFLG_SMART_REFRESH nel tag WA_Flags.
  56.  
  57. SuperBitMap refresh
  58. Nelle finestre SuperBitMap l'utente specifica il BitMap (struttura che
  59. contiene le informazione per un'immagine o uno spazio grafico) che il
  60. sistema utilizzerà per il rinfresco della finestra; questo tipo di finestra
  61. serve quando quest'ultima può essere più piccola dell'immagine (nel qual
  62. caso la finestra mostra solo una porzione dell'immagine); ad esempio se si
  63. utilizza una finestra ridimensionabile, si disegna qualcosa e la si riduce,
  64. quando si riallarga la zona dell'immagine oscurata dal rimpicciolimento
  65. della finestra viene rinfrescata; naturalmente questo tipo di finestra si
  66. propone anche per altri utilizzi, quali ad esempio lo scorrimento di
  67. un'immagine più grande nella stessa, come fa MultiView; normalmente una
  68. finestra SuperBitMap è anche GimmeZeroZero, in modo da avere due layer
  69. differenti, uno per il contenuto e uno per il bordo; questo tipo di finestra
  70. si imposta con WFLG_SUPER_BITMAP in WA_Flags.
  71.  
  72. Mentre per i primi due rinfreschi serve semplicemente impostare il flag
  73. indicato ed il resto sarà compito del sistema, nella finestra SuperBitMap
  74. occorre allocare ed inizializzare una struttura BitMap nostra e passarla al
  75. tag WA_SuperBitMap all'apertura della finestra; per inizializzare una BitMap
  76. occorre allocare una struttura BitMap, inizializzarne i campi con la
  77. funzione:
  78.  
  79. InitBitMap(bitmap,profondità,ampiezza,altezza);
  80.  
  81. dove "bitmap" è il puntatore alla struttura BitMap da inizializzare,
  82. "profondità", "ampiezza" e "altezza" sono LONG indicanti la dimensione della
  83. bitmap; una volta inizializzata la bitmap, occorre allocare la memoria che
  84. contiene i piani dei bit dell'immagine mediante la funzione:
  85.  
  86. puntpiano = AllocRaster(ampiezza,altezza);
  87.  
  88. bisogna chiamare questa funzione per ogni bitplane da allocare, il cui
  89. puntatore è restituito in "puntpiano" che è di tipo PLANEPTR; questi
  90. puntatori dovranno essere inseriti nel campo vettore Planes della struttura
  91. BitMap; all'uscita del programma bisogna deallocare i bitplanes con
  92.  
  93. FreeRaster(puntpiano,ampiezza,altezza);
  94.